#include <mips/regdef.h>
#include <sys/syscall.h>

	.text
	.align  2
	.globl	dos2unix
	.ent	dos2unix

dos2unix:
	.frame	$fp, 40, ra
	.set	noreorder
	.cpload	t9
	.set	reorder
	subu	sp, sp, 40
	.cprestore	24

	sw	ra,  32(sp)
	sw	$fp, 28(sp)

	move	$fp, sp

	sw	a0, 40($fp)		# file descriptor input
	sw	a1, 44($fp)		# file descriptor output
	sw	a2, 48($fp)		# file descriptor error

leer_caracter:
# Leer un caracter del archivo
	li	v0, SYS_read
	lw	a0, 40($fp)
	addiu  a1, $fp, 16
	li	a2, 1
	syscall

# Si es EOF
	beqz	v0, salir

	bnez	a3, error_lectura
	bne	v0, 1, error_lectura


#	"if(caracter == barraR)"
	lb	t0, 16($fp)
	lb	t1, barraR
	beq	t0, t1, leerOtro

#	Si (caracter != EOF)
	bnez	v0, escribir_caracter


leerOtro:
#	Leer un caracter del archivo
	li	v0, SYS_read
	lw	a0, 40($fp)
	addiu  a1, $fp, 20
	li	a2, 1
	syscall

# Si es EOF (escribe el caracter leido primero).
	beqz	v0, escribir_caracter

	bnez	a3, error_lectura
	bne		v0, 1, error_lectura

#	'if(caracterAuxiliar == barraN)'
	lb	t0, 20($fp)
	lb	t1, barraN

	beq	t0, t1, escribir_carAux

escribir_barraR:
	li	v0, SYS_write
	lw 	a0, 44($fp)
	la	a1, barraR
	li	a2, 1
	syscall

	bnez	a3, error_escritura
	bne		v0, 1, error_escritura

	# Cargo en t0 el valor del caracterAuxiliar
	lb		t0, 20($fp)

	# Si (caracterAuxiliar == EOF)
	beqz	t0, salir

escribir_carAux:
	#	"if(caracterAuxiliar == EOF)"
	beqz	v0, salir

	li	v0, SYS_write
	lw	a0, 44($fp)
	addiu  a1, $fp, 20
	li	a2, 1
	syscall

	bnez	a3, error_escritura
	bne		v0, 1, error_escritura

	b	leer_caracter

escribir_caracter:
	li	v0, SYS_write
	lw	a0, 44($fp)
	addiu  a1, $fp, 16
	li	a2, 1
	syscall

	bnez	a3, error_escritura
	bne		v0, 1, error_escritura

	b	leer_caracter

#------------------Retornos---------------------------#

error_lectura:
	li	v0, SYS_write
	lw	a0, 48($fp)
    la	a1, msg_error_lectura
	li	a2, 14
	syscall

    li	v0, 1    # Si hubo un error de parametro se debe finalizar con valor distinto a 0
	b	salir

error_escritura:
	li	v0, SYS_write
	lw	a0, 48($fp)
	la	a1, msg_error_escritura
	li	a2, 16
	syscall

	li	v0, 1    # Si hubo un error de parametro se debe finalizar con valor distinto a 0
	b	salir

#----------Reconstruccion del stack-------------------#
salir:
	move	sp, $fp
	lw	ra,	32(sp)
	lw	$fp, 28(sp)
	lw	gp,	24(sp)

	lw	a0, 40(sp)
	lw	a1, 44(sp)
	lw	a2, 48(sp)

	addiu	sp, sp, 40
	jr	ra

	.end dos2unix

.rdata   # permite agragar indica que lo que sigue va en el dataseg
#--------Caracteres especiales--------#
barraN:
	.asciiz "\n"
barraR:
	.asciiz "\r"
#--------Mensajes de Error------------#
msg_error_lectura:
	.asciiz "ERROR LECTURA\n"
msg_error_escritura:
	.asciiz "ERROR ESCRITURA\n"
